/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package it.univaq.iw.jweb;

import it.univaq.iw.jweb.data.Curriculum;
import it.univaq.iw.jweb.data.DataAccess;
import it.univaq.iw.jweb.data.LingueRichieste;
import it.univaq.iw.jweb.data.ProfiloRicerca;
import it.univaq.iw.jweb.data.Province;
import it.univaq.iw.jweb.data.Regioni;
import it.univaq.iw.jweb.data.Servizio;
import it.univaq.iw.jweb.utils.ControlsHelpers;
import it.univaq.iw.jweb.utils.SecurityHelpers;
import it.univaq.iw.jweb.utils.TemplateManager;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author stefano
 */
public class CercaCurriculum extends HttpServlet {

    private TemplateManager tpl;
    private DataAccess da;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);

        da = DataAccess.getInstance();
        tpl = TemplateManager.getInstance(getServletContext());
        tpl.setOutlineTemplate("outline");
        tpl.setDefaultData("author", "Del Vecchio - Bevini - Delfino");
        tpl.setDefaultData("homepage_url", "home");
        
    }

    private void selezionaServizi (String email) throws ServletException {

        List<Servizio> servizi = new ArrayList();
        if (email != null && !email.isEmpty()) {
        
            String nomeGruppo = da.searchNomeGruppo(email);
            servizi = da.searchServiziGruppo(nomeGruppo);

            if (nomeGruppo.equalsIgnoreCase("Candidato")) {

                /* preparo i servizi in base allo stato del candidato */
                Iterator<Servizio> it = servizi.iterator();
                while (it.hasNext()) {
                    Servizio servizio = it.next();
                    if (da.curriculumCompletoByMail(email)) { /* curriculum completato */

                        if (servizio.getNome().equalsIgnoreCase("inserisciCurriculum")
                                || (da.hasPreferences(email) && servizio.getNome().equalsIgnoreCase("inserisciPreferenze"))) {

                            it.remove();

                        } else if(servizio.getNome().equalsIgnoreCase("inserisciCurriculum")
                                || (!da.hasPreferences(email) && servizio.getNome().equalsIgnoreCase("modificaPreferenze"))) {

                            it.remove();
                        }

                    } else { /* curriculum incompleto */

                        if (servizio.getNome().equalsIgnoreCase("inserisciPreferenze")
                                || servizio.getNome().equalsIgnoreCase("modificaPreferenze")
                                || servizio.getNome().equalsIgnoreCase("modificaCurriculum")
                                || servizio.getNome().equalsIgnoreCase("visualizzaCurriculum")
                                || servizio.getNome().equalsIgnoreCase("eliminaCurriculum")) {

                            it.remove();
                        }
                    }
                }
            }
            if (nomeGruppo.equalsIgnoreCase("Azienda")) {

                /* preparo i servizi in base allo stato del azienda */
                Iterator<Servizio> it = servizi.iterator();
                while (it.hasNext()) {
                    Servizio servizio = it.next();
                    if (da.hasProfiloRicerca(da.searchPIAziendaByMail(email))) { /* profilo ricerca completato */

                        if (servizio.getNome().equalsIgnoreCase("inserisciProfiloRicerca")) {

                            it.remove();

                        }

                    } else { /* profilo ricerca incompleto */

                        if (servizio.getNome().equalsIgnoreCase("modificaProfiloRicerca")) {

                            it.remove();

                        }
                    }
                }
            }
        }
        tpl.setDefaultData("servizi", servizi);
    }

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException{
        response.setContentType("text/html;charset=UTF-8");

        Map datamodel = tpl.getDefaultDataModel();
        PrintWriter out = response.getWriter();

        boolean completo = false;
        Set<Curriculum> risultati = new TreeSet();
        String nomegruppo = null;

        HttpSession s = SecurityHelpers.checkSession(request);
        if (s == null) {
            
            tpl.setDefaultData("logged", false);
            selezionaServizi(null);

        } else {

            tpl.setDefaultData("logged", true);
            selezionaServizi(s.getAttribute("email").toString());
            nomegruppo = da.searchNomeGruppo(s.getAttribute("email").toString());
            if (nomegruppo.equalsIgnoreCase("azienda")) completo = true;

        }

            if (request.getParameterMap().containsKey("a")) { /* home page dell'azienda */

                String pi = da.searchPIAziendaByMail(s.getAttribute("email").toString());
                
                if (da.hasProfiloRicerca(pi)) {

                    ProfiloRicerca profilo = da.searchProfiloRicercaByEmail(s.getAttribute("email").toString());

                    if (profilo.getEtaMin() > 0 && profilo.getEtaMax() >= profilo.getEtaMin()) {
                        risultati = makeRisultato(da.searchCurriculumEta(new Integer(profilo.getEtaMin()).toString(),new Integer(profilo.getEtaMax()).toString()),risultati);
                    }

                    if (!profilo.getSesso().isEmpty()) {
                        risultati = makeRisultato(da.searchCurriculumBySesso(profilo.getSesso()),risultati);
                    }

                    if (!profilo.getIstruzioneRichiesta().getTitoloStudio().isEmpty()) {
                        risultati = makeRisultato(da.searchCurriculumByTitoloStudio(profilo.getIstruzioneRichiesta().getTitoloStudio()),risultati);
                    }

                    if (!profilo.getIstruzioneRichiesta().getSettore().isEmpty()) {
                        risultati = makeRisultato(da.searchCurriculumBySettoreStudio(profilo.getIstruzioneRichiesta().getSettore()),risultati);
                    }
                    if (!profilo.getPreferenzaLavorativa().getTipoImpiego().isEmpty()) {
                        String tipoImpiego = (profilo.getPreferenzaLavorativa().getTipoImpiego().equalsIgnoreCase("PT")?"Part Time":(profilo.getPreferenzaLavorativa().getTipoImpiego().equalsIgnoreCase("FT")?"Full Time":"Dirigenziale"));
                        risultati = makeRisultato(da.searchCurriculumByTipoImpiego(tipoImpiego),risultati);
                    }

                    if (!profilo.getPreferenzaLavorativa().getProvincia().isEmpty()) {
                        risultati = makeRisultato(da.searchCurriculumByProvincia(profilo.getPreferenzaLavorativa().getProvincia()),risultati);
                    }

                    if (!profilo.getPreferenzaLavorativa().getRegione().isEmpty()) {
                        risultati = makeRisultato(da.searchCurriculumByRegione(profilo.getPreferenzaLavorativa().getRegione()),risultati);
                    }

                    LingueRichieste lingue = profilo.getLingueRichieste();

                    if (!lingue.getLingue().isEmpty()) {
                        risultati = makeRisultato(da.searchCurriculumByLingue(lingue),risultati);
                    }

                    if (!profilo.getAutomunito().isEmpty()) {
                        System.out.println(profilo.getAutomunito());
                        risultati = makeRisultato(da.searchCurriculumByAutomunito(profilo.getAutomunito()),risultati);
                    }

                    if (profilo.getIstruzioneRichiesta().getVotoMin() > 0 && profilo.getIstruzioneRichiesta().getVotoMax() >= profilo.getIstruzioneRichiesta().getVotoMin()) {
                        risultati = makeRisultato(da.searchCurriculumByVotazione(
                                new Integer(profilo.getIstruzioneRichiesta().getVotoMin()).toString(),
                                new Integer(profilo.getIstruzioneRichiesta().getVotoMax()).toString()),risultati);
                    }

                    if (!profilo.getPreferenzaLavorativa().getSettore().isEmpty()) {
                        risultati = makeRisultato(da.searchCurriculumBySettoriLavorativi(profilo.getPreferenzaLavorativa().getSettore()),risultati);
                    }

                    if (profilo.getEsperienzaRichiesta().getPeriodo() > 0) {
                        risultati = makeRisultato(da.searchCurriculumByPeriodo(
                                new Integer(profilo.getEsperienzaRichiesta().getPeriodo()).toString()),risultati);
                    }

                    risultati = da.searchNuoviCurriculum(risultati,s.getAttribute("email").toString());

                    datamodel.put("risultati",risultati);
                    datamodel.put("nomegruppo", "azienda");
                    datamodel.put("nome", da.searchNomeAzienda(s.getAttribute("email").toString()));
                    datamodel.put("numeroNuovi", risultati.size());

                    tpl.process("home", datamodel, out);
                    out.close();
                    return;

                } else {

                    datamodel.put("action", "cercaCurriculum?t=m");
                    datamodel.put("profiloRicerca", da.searchProfiloRicercaByEmail(s.getAttribute("email").toString()));
                    datamodel.put("titoli", da.getTitoli());
                    datamodel.put("province", Province.values());
                    datamodel.put("regioni", Regioni.values());
                    datamodel.put("settori", da.getSettoriLavorativi());
                    datamodel.put("lingue", da.getLingue());
                    tpl.process("formInserimentoProfiloRicerca", datamodel, out);
                    out.close();
                    return;
                }

            } else {

                if (request.getParameterMap().containsKey("t")) { /* elabora il form e cerca i risultati */

                    String etaMin = request.getParameter("etaMin");
                    String etaMax = request.getParameter("etaMax");

                    if (etaMin != null && !etaMin.isEmpty() && etaMax != null && !etaMax.isEmpty()) {

                        if (Integer.parseInt(etaMin) <= Integer.parseInt(etaMax)) {

                            risultati = makeRisultato(da.searchCurriculumEta(etaMin,etaMax),risultati);

                        } else {

                            datamodel.put("errore", "ATTENZIONE! Inserisci correttamente le età.");
                            datamodel.put("titoli", da.getTitoli());
                            datamodel.put("province", Province.values());
                            datamodel.put("regioni", Regioni.values());
                            datamodel.put("settori", da.getSettoriLavorativi());
                            datamodel.put("lingue", da.getLingue());
                            tpl.process("search", datamodel, out);
                            out.close();
                            return;
                        }
                    }

                    if (request.getParameterMap().containsKey("sesso")) {
                        risultati = makeRisultato(da.searchCurriculumBySesso(request.getParameter("sesso")),risultati);
                    }

                    if (!request.getParameter("titoloStudio").equalsIgnoreCase("TITOLO DI STUDIO")) {
                        risultati = makeRisultato(da.searchCurriculumByTitoloStudio(request.getParameter("titoloStudio")),risultati);
                    }

                    if (request.getParameter("settoreStudio") != null && !request.getParameter("settoreStudio").isEmpty()) {
                        risultati = makeRisultato(da.searchCurriculumBySettoreStudio(request.getParameter("settoreStudio")),risultati);
                    }
                    if (request.getParameterMap().containsKey("tipoImpiego")) {
                        String tipoImpiego = (request.getParameter("tipoImpiego").equalsIgnoreCase("PT")?"Part Time":(request.getParameter("tipoImpiego").equalsIgnoreCase("FT")?"Full Time":"Dirigenziale"));
                        risultati = makeRisultato(da.searchCurriculumByTipoImpiego(tipoImpiego),risultati);
                    }

                    if (!request.getParameter("provincia").equalsIgnoreCase("Provincia")) {
                        risultati = makeRisultato(da.searchCurriculumByProvincia(request.getParameter("provincia")),risultati);
                    }

                    if (!request.getParameter("regione").equalsIgnoreCase("Regione")) {
                        risultati = makeRisultato(da.searchCurriculumByRegione(request.getParameter("regione")),risultati);
                    }

                    LingueRichieste lingue = new LingueRichieste();
                    for(int i=0; i<3; i++) {
                        if (!request.getParameter("lingua"+i).equalsIgnoreCase("Selezionare Lingua")) {
                            lingue.getLingue().add(request.getParameter("lingua"+i));
                        }
                    }
                    if (!lingue.getLingue().isEmpty()) {
                        risultati = makeRisultato(da.searchCurriculumByLingue(lingue),risultati);
                    }

                    if (completo) {

                        if (request.getParameterMap().containsKey("automunito")) {
                            risultati = makeRisultato(da.searchCurriculumByAutomunito(request.getParameter("automunito")),risultati);
                        }

                        String votoMin = request.getParameter("votoMin");
                        String votoMax = request.getParameter("votoMax");

                        if (votoMin != null && !votoMin.isEmpty() && votoMax != null && !votoMax.isEmpty()) {

                            if (ControlsHelpers.controllaVotazione(votoMax) && ControlsHelpers.controllaVotazione(votoMin) && Integer.parseInt(votoMin) <= Integer.parseInt(votoMax)) {

                                risultati = makeRisultato(da.searchCurriculumByVotazione(votoMin,votoMax),risultati);

                            } else {

                                datamodel.put("errore", "ATTENZIONE! Inserisci correttamente la votazione richiesta.");
                                datamodel.put("titoli", da.getTitoli());
                                datamodel.put("province", Province.values());
                                datamodel.put("regioni", Regioni.values());
                                datamodel.put("settori", da.getSettoriLavorativi());
                                datamodel.put("lingue", da.getLingue());
                                tpl.process("search", datamodel, out);
                                out.close();
                                return;
                            }
                        }

                        if (!request.getParameter("settore").equalsIgnoreCase("Settore Lavorativo")) {
                            risultati = makeRisultato(da.searchCurriculumBySettoriLavorativi(request.getParameter("settore")),risultati);
                        }

                        String periodo = request.getParameter("mesi");
                        if (periodo != null && !periodo.isEmpty()) {

                            if (Integer.parseInt(periodo) > 0) {

                                risultati = makeRisultato(da.searchCurriculumByPeriodo(request.getParameter("mesi")),risultati);

                            } else {

                                datamodel.put("errore", "ATTENZIONE! Inserisci un numero di mesi maggiore di 0.");
                                datamodel.put("titoli", da.getTitoli());
                                datamodel.put("province", Province.values());
                                datamodel.put("regioni", Regioni.values());
                                datamodel.put("settori", da.getSettoriLavorativi());
                                datamodel.put("lingue", da.getLingue());
                                tpl.process("search", datamodel, out);
                                out.close();
                                return;
                            }
                        }
                    }

                    datamodel.put("risultati", risultati);
                    tpl.process("risultati", datamodel, out);
                    out.close();
                    return;

                } else {

                    if (nomegruppo != null && nomegruppo.equalsIgnoreCase("Azienda")) {

                        datamodel.put("action", "cercaCurriculum?t=m");
                        datamodel.put("profiloRicerca", da.searchProfiloRicercaByEmail(s.getAttribute("email").toString()));
                        datamodel.put("titoli", da.getTitoli());
                        datamodel.put("province", Province.values());
                        datamodel.put("regioni", Regioni.values());
                        datamodel.put("settori", da.getSettoriLavorativi());
                        datamodel.put("lingue", da.getLingue());
                        tpl.process("modificaProfiloRicerca", datamodel, out);
                        out.close();
                        return;

                    } else {

                        datamodel.put("titoli", da.getTitoli());
                        datamodel.put("province", Province.values());
                        datamodel.put("regioni", Regioni.values());
                        datamodel.put("settori", da.getSettoriLavorativi());
                        datamodel.put("lingue", da.getLingue());
                        tpl.process("search", datamodel, out);
                        out.close();
                        return;

                    }
                }
            }
        
    }

    private Set<Curriculum> makeRisultato(Set<Curriculum> risultatiNew, Set<Curriculum> risultati) {

        if (risultati.isEmpty()) return risultatiNew;
        //else if (risultatiNew.isEmpty()) return risultati;

        if (risultatiNew.size() < risultati.size()) { /* risultati insieme + piccolo */

            Iterator<Curriculum> it = risultati.iterator();
            while(it.hasNext()) {
                Curriculum curr = it.next();
                Iterator<Curriculum> itNew = risultatiNew.iterator();
                boolean trovato = false;
                while(itNew.hasNext()) {
                    if (curr.getId() == itNew.next().getId()) trovato = true;
                }
                if(!trovato) it.remove();
            }
            return risultati;

        } else { /* risultatiNext insiame + piccolo */

            Iterator<Curriculum> itNew = risultatiNew.iterator();
            while(itNew.hasNext()) {
                Curriculum curr = itNew.next();
                Iterator<Curriculum> it = risultati.iterator();
                boolean trovato = false;
                while(it.hasNext()) {
                    if (curr.getId() == it.next().getId()) trovato = true;
                }
                if(!trovato) itNew.remove();
            }
            return risultatiNew;
        }
    }


    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>


}
